#code from https://stackoverflow.com/questions/13857/can-you-explain-closures-as-they-relate-to-python


"""
Objects are data with methods attached, closures are functions with data attached.
"""

def make_counter():
    i = 0
    #nonlocal is used in python3.x
    #in python2 you can use imutable type.
    def counter(): # counter() is a closure

        nonlocal i
        i += 1
        return i
    return counter

c1 = make_counter()
c2 = make_counter()

print (c1(), c1(), c2(), c2())
# -> 1 2 1 2